import { spawn } from 'child_process';

export const run = async (command: string, cwd: string) => {
    return new Promise<void>((resolve, reject) => {
        const [cmd, ...args] = command.split(' ');
        const app = spawn(cmd, args, {
            cwd,
            stdio: 'inherit',
            shell: process.platform === 'win32',
        });

        // 向进程发送SIGHUP signal，对于不同类型的进程可能产生不一样的效果。
        // 如果pid对象为daemon，则kill - 1 为重新加载配置；如果pid对象为一般进程则为杀掉进程。
        const onProcessExit = () => app.kill('SIGHUP');

        // 当进程要退出之前，会触发exit事件。通过监听exit事件，我们可就以在进程退出前进行一些清理工作
        process.on('exit', onProcessExit);

        // close事件在子进程退出时触发
        app.on('close', code => {
            process.removeListener('exit', onProcessExit);

            if (code === 0) resolve();
            else reject(new Error(`Command failed. \n Command: ${command} \n Code: ${code}`));
        });
    });
}
